{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**问题：**\n",
    "假设你正在为一个电影推荐系统设计一个简单的KNN算法。我们有以下一些用户的电影评分数据，数据由两个特征组成：用户对电影A和电影B的评分，分别在1-5之间。用户的标签（电影类型偏好）是动作片（标签0）或者是喜剧片（标签1）。我们有一个新用户，他给电影A评分为3，电影B评分为4。请问这个用户可能偏好哪种类型的电影？\n",
    "\n",
    "**数据：**\n",
    "\n",
    "| 用户   | 电影A评分 | 电影B评分 | 偏好类型 |\n",
    "| ------ | --------- | --------- | -------- |\n",
    "| 用户1  | 5         | 1         | 动作片   |\n",
    "| 用户2  | 4         | 2         | 动作片   |\n",
    "| 用户3  | 2         | 5         | 喜剧片   |\n",
    "| 用户4  | 1         | 4         | 喜剧片   |\n",
    "| 用户5  | 3         | 2         | 动作片   |\n",
    "| 用户6  | 2         | 5         | 喜剧片   |\n",
    "\n",
    "你需要做以下步骤：\n",
    "1. 构造数据\n",
    "2. 创建KNN模型\n",
    "3. 使用数据训练模型\n",
    "4. 预测新用户的喜好"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. 引入核心包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 0, 1, 1, 0, 1])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = np.array([[5,1],[4,2],[2,5],[1,4],[3,2],[2,5]])\n",
    "X\n",
    "y =np.array([0,0,1,1,0,1]) # 0表示动作片，1表示喜剧片\n",
    "y"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 创建 KNN 模型\n",
    "k = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn = KNeighborsClassifier(n_neighbors=1)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {color: black;}#sk-container-id-1 pre{padding: 0;}#sk-container-id-1 div.sk-toggleable {background-color: white;}#sk-container-id-1 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-1 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-1 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-1 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-1 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-1 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-1 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-1 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-1 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-1 div.sk-item {position: relative;z-index: 1;}#sk-container-id-1 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-1 div.sk-item::before, #sk-container-id-1 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-1 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-1 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-1 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-1 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-1 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-1 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-1 div.sk-label-container {text-align: center;}#sk-container-id-1 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-1 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=1)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">KNeighborsClassifier</label><div class=\"sk-toggleable__content\"><pre>KNeighborsClassifier(n_neighbors=1)</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=1)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn.fit(X,y)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 用模型推理(预测)用户的喜好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "new_user = np.array([[3, 4]])\n",
    "prediction =knn.predict(new_user)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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RKRo5aooEhEptus83NWCjhCJSDE4/Y7WIiIiIuWBiiIRERERVBSJiIiIACqKRERERAAVRSIiIiKAiiIRERERQEWRiIiICKCiSERERARQUSQiIiICqCgSERERAVQUiYiIiAAqikREREQAFUUiIiIigIoiEREREUBFkYiIiAigokhEREQEUFEkIiIiAqgoEhEREQFUFImIiIgAKopEREREABVFIiIiIoCKIhERERFARZGIiIgIoKJIREREBFBRJCIiIgKoKBIREREBVBSJiIiIACqKRERERADwsnWFp556ymq7yWTCz8+PRo0aERMTQ9WqVUsdnIiIiEhZsbko2rlzJzt27CAnJ4emTZsC8Msvv+Dp6UlYWBhvv/02Tz/9NBs3buSWW26xe8AiIiIijmDz6bOYmBjuvPNOTpw4wfbt29m+fTvHjh0jKiqKuLg4jh8/zu23386TTz553bHmzZtHy5YtCQoKIigoiMjISFauXFlo//j4eEwmk8XLz8/P1hRERERECrD5SNHs2bNJTEwkKCjI3FapUiWmTZtGz549GTNmDM8++yw9e/a87lh16tThxRdfpHHjxhiGwfvvv09MTAw7d+6kWbNmVtcJCgpi37595vcmk8nWFEREREQKsLkoSktL4/Tp0wVOjf3vf/8jPT0dgMqVK3P58uXrjnXXXXdZvH/++eeZN28e3333XaFFkclkIiQkxNawRURERIpkc1EUExPD8OHDefXVV2nfvj0AW7duZdy4ccTGxgLw3//+lyZNmtg0bk5ODp9++ikXLlwgMjKy0H4ZGRnUq1eP3NxcIiIieOGFFwotoACysrLIysoyv88v3LKzs8nOzrYpxuvJH8/e45YX7p4fuH+Oys/1uXuOys/1OSrHsvjMTIZhGLaskJGRwZNPPsk///lPrly5AoCXlxdDhw5lzpw5VKxYkeTkZABat2593fF27dpFZGQkly5dIiAggISEBPr27Wu175YtW9i/fz8tW7YkLS2NV155hfXr17Nnzx7q1KljdZ1p06Yxffr0Au0JCQn4+/sXL2kRERFxqszMTAYNGkRaWprFFB57srkoypeRkcGvv/4KwM0330xAQECJArh8+TIpKSmkpaXx2WefsWDBAtatW1esK9eys7MJDw8nLi6OmTNnWu1j7UhRaGgoZ86csfuHmp2dTWJiIlFRUXh7e9t17PLA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vR32hXTk2OWBu+cH7p+j8nN97p6j8nN99s6xLD4vmx7z8dNPP3Hy5Ekg7wGwP//8s/nKszNnztgloNzcXIs5QFeLjIxk7dq1jB071tyWmJhY6BwkERERkeKyqSjq0aMHV09B+stf/gKAyWTCMAxMJpNNG580aRJ9+vShbt26nD9/noSEBJKSkli9ejUAQ4YMoXbt2syaNQuAMWPG0LVrV1599VWio6NZsmQJ27Zt491337VpuyIiIiLXKnZRdOjQIbtv/PTp0wwZMoTU1FQqVapEy5YtWb16NVFRUUDePCYPjz/vGtC5c2cSEhKYMmUKkydPpnHjxixfvtxibpOIiIhISRS7KKpXr57dN75w4cIilyclJRVoGzBgAAMGDLB7LCIiInJj07PPRERERFBRJCIiIgKoKBIREREBVBSJiIiIACUsiq5cucKaNWuYP38+58+fB+DEiRPmexaJiIiIuBqb7lMEcOTIEXr37k1KSgpZWVlERUURGBjISy+9RFZWFu+8844j4hQRERFxKJuPFI0ZM4Z27dpx7tw5KlSoYG6/++67Wbt2rV2DExERESkrNh8p2rBhA5s3b8bHx8eivX79+hw/ftxugYmIiIiUJZuPFOXm5lp98OuxY8cIDAy0S1AiIiIiZc3moqhnz568/vrr5vcmk4mMjAymTp1K37597RmbiIiISJmx+fTZq6++Sq9evbjlllu4dOkSgwYNYv/+/VSvXp2PPvrIETGKiIiIOJzNRVGdOnX44YcfWLJkCT/++CMZGRmMGDGCwYMHW0y8FhEREXElNhdFAF5eXtx///32jkVERETEaYpVFH3xxRf06dMHb29vvvjiiyL79uvXzy6BiYiIiJSlYhVFsbGxnDx5kuDgYGJjYwvtZzKZrF6ZJiIiIlLeFasoys3NtfpnEREREXdh8yX5R48edUQcIiIiIk5lc1FUv359unbtynvvvce5c+ccEZOIiIhImbO5KNq2bRsdOnRgxowZ1KxZk9jYWD777DOysrIcEZ+IiIhImbC5KGrTpg2zZ88mJSWFlStXctNNN/Hwww9To0YNhg8f7ogYRURERBzO5qIon8lkonv37rz33nusWbOGBg0a8P7779szNhEREZEyU+Ki6NixY7z88su0bt2aDh06EBAQwFtvvWXP2ERERETKjM13tJ4/fz4JCQls2rSJsLAwBg8ezL///W/q1avniPhEREREyoTNRdFzzz1HXFwcb7zxBq1atXJETCIiIiJlzuaiKCUlBZPJ5IhYRERERJzG5qLIZDLx+++/s3DhQvbu3QvALbfcwogRI6hUqZLdAxQREREpCyW6T1HDhg2ZM2cOv/32G7/99htz5syhYcOG7NixwxExioiIiDiczUeKnnzySfr168d7772Hl1fe6leuXGHkyJGMHTuW9evX2z1IEREREUezuSjatm2bRUEE4OXlxYQJE2jXrp1dgxMREREpKzafPgsKCiIlJaVA+9GjRwkMDLRLUCIiIiJlzeaiaODAgYwYMYKPP/6Yo0ePcvToUZYsWcLIkSOJi4tzRIwiIiIiDmdzUfTKK6/Qv39/hgwZQv369alfvz7Dhg3j3nvv5aWXXrJprFmzZtG+fXsCAwMJDg4mNjaWffv2FblOfHw8JpPJ4uXn52drGiIiIiIWbJ5T5OPjw9y5c5k1axYHDx4EoGHDhvj7+9u88XXr1jFq1Cjat2/PlStXmDx5Mj179uSnn36iYsWKha4XFBRkUTzpvkkiIiJSWjYXRfn8/f1p0aJFqTa+atUqi/fx8fEEBwezfft2br/99kLXM5lMhISElGrbIiIiIlcrdlE0fPjwYvVbtGhRiYNJS0sDoGrVqkX2y8jIoF69euTm5hIREcELL7xAs2bNrPbNysoiKyvL/D49PR2A7OxssrOzSxyrNfnj2Xvc8sLd8wP3z1H5uT53z1H5uT5H5VgWn5nJMAyjOB09PDyoV68ebdq0oahVli1bVqJAcnNz6devH7///jsbN24stN+WLVvYv38/LVu2JC0tjVdeeYX169ezZ88e6tSpU6D/tGnTmD59eoH2hISEEp3yExERkbKXmZnJoEGDSEtLIygoyCHbKHZRNGrUKD766CPq1avHgw8+yP3333/dIzq2ePTRR1m5ciUbN260WtwUJjs7m/DwcOLi4pg5c2aB5daOFIWGhnLmzBm7f6jZ2dkkJiYSFRWFt7e3XccuD9w9P3D/HJWf63P3HJWf63NUjunp6VSvXt2hRVGxT5+99dZbvPbaayxdupRFixYxadIkoqOjGTFiBD179izVZOfRo0fz5Zdfsn79epsKIgBvb2/atGnDgQMHrC739fXF19fX6nqO+kI6cuzywN3zA/fPUfm5PnfPUfm5PnvnWBafl02X5Pv6+hIXF0diYiI//fQTzZo147HHHqN+/fpkZGTYvHHDMBg9ejTLli3jm2++oUGDBjaPkZOTw65du6hZs6bN64qIiIjkK/HVZx4eHphMJgzDICcnp0RjjBo1ioSEBP79738TGBjIyZMnAahUqRIVKlQAYMiQIdSuXZtZs2YBMGPGDDp16kSjRo34/fffmT17NkeOHGHkyJElTUVERETEtiNFWVlZfPTRR0RFRdGkSRN27drFm2++SUpKCgEBATZvfN68eaSlpdGtWzdq1qxpfn388cfmPikpKaSmpprfnzt3joceeojw8HD69u1Leno6mzdv5pZbbrF5+yIiIiL5in2k6LHHHmPJkiWEhoYyfPhwPvroI6pXr16qjRdnjndSUpLF+zlz5jBnzpxSbVdERETkWsUuit555x3q1q3LzTffzLp161i3bp3VfkuXLrVbcCIiIiJlpdhF0ZAhQ/Q4DREREXFbxS6K4uPjHRiGiIiIiHPZNNFaRERExF2pKBIRERFBRZGIiIgIoKJIREREBFBRJCIiIgKoKBIREREBVBSJiIiIACqKRERERAAVRSIiIiKAiiIRERERQEWRiIiICKCiSERERARQUSQiIiICqCgSETd19uxZgoODOXz4cJlu9/Lly9SvX59t27aV6XbdkfahlDUVRSLilp5//nliYmKoX78+kPcXbO/evalVqxa+vr6EhoYyevRo0tPTbRp31qxZtG/fnsDAQIKDg4mNjWXfvn3m5T4+PowbN45nnnnGnunckK7dh1c7e/YsderUwWQy8fvvv9s0rvahFEZFkYi4nczMTBYuXMiIESPMbR4eHsTExPDFF1/wyy+/EB8fz5o1a3jkkUdsGnvdunWMGjWK7777jsTERLKzs+nZsycXLlww9xk8eDAbN25kz549dsvpRmNtH15txIgRtGzZskRjax9KYVQUiYjbWblyJb6+vnTq1MncVqVKFR599FHatWtHvXr16NGjB4899hgbNmywaexVq1YxbNgwmjVrRqtWrYiPjyclJYXt27dbbKtLly4sWbLEbjndaKztw3zz5s3j999/Z9y4cSUaW/tQCuPl7ABEROxt06ZNtG3btsg+J06cYOnSpXTt2rVU20pLSwOgatWqFu0dOnSwueCSPxW2D3/66SdmzJjB999/z6+//mqXbWkfSj4dKRIRt3PkyBFq1apldVlc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RAAVRSIiIiKAiiIRERERQEWRiIiICKCiSERERARwclG0fv167rrrLmrVqoXJZGL58uVF9k9KSsJkMhV4nTx5smwCFhEREbfl1KLowoULtGrVirfeesum9fbt20dqaqr5FRwc7KAIRURE5Ebh5cyN9+nThz59+ti8XnBwMJUrV7Z/QCIiInLDcmpRVFKtW7cmKyuL5s2bM23aNLp06VJo36ysLLKysszv09PTAcjOziY7O9uuceWPZ+9xywt3zw/cP0fl5/rcPUfl5/oclWNZfGYmwzAMh2+lGEwmE8uWLSM2NrbQPvv27SMpKYl27dqRlZXFggUL+OCDD/j++++JiIiwus60adOYPn16gfaEhAT8/f3tFb6IiIg4UGZmJoMGDSItLY2goCCHbMOliiJrunbtSt26dfnggw+sLrd2pCg0NJQzZ87Y/UPNzs4mMTGRqKgovL297Tp2eeDu+YH756j8XJ+756j8XJ+jckxPT6d69eoOLYpc8vTZ1Tp06MDGjRsLXe7r64uvr2+Bdm9vb4d9IR05dnng7vmB++eo/Fyfu+eo/FyfvXMsi8/L5e9TlJycTM2aNZ0dhoiIiLg4px4pysjI4MCBA+b3hw4dIjk5mapVq1K3bl0mTZrE8ePH+ec//wnA66+/ToMGDWjWrBmXLl1iwYIFfPPNN3z99dfOSkFERETchFOLom3bttG9e3fz+6eeegqAoUOHEh8fT2pqKikpKeblly9f5umnn+b48eP4+/vTsmVL1qxZYzGGiIiISEk4tSjq1q0bRc3zjo+Pt3g/YcIEJkyY4OCoRERE5Ebk8nOKREREROxBRZGIiIgIKopEREREABVFIiIiIoCKIhERERFARZGIiIgIoKJIREREBFBRJCIiIgKoKBIREREBVBSJiIiIACqKRERERAAVRSIiIiKAiiIRERERQEWRiIiICKCiSERERARQUSQiIiICqCgSERERBzl79izBwcEcPny4zLfdqVMnPv/8c5vWUVEkIiIiDvH8888TExND/fr1zW0mk6nAa8mSJTaNu379eu666y5q1aqFyWRi+fLlBfpMmTKFiRMnkpubW+xxVRSJiIiI3WVmZrJw4UJGjBhRYNnixYtJTU01v2JjY20a+8KFC7Rq1Yq33nqr0D59+vTh/PnzrFy5stjjetkUhYiIiEgxrFy5El9fXzp16lRgWeXK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MW666SajR48e5mLBMFx73+WzNUdX2n+FubZocIf9eLXr5edq+3DgwIFGzZo1DR8fH6N27drGwIEDjQMHDpiXu/r+MxmGYZTdcSkRERGR8klzikRERERQUSQiIiICqCgSERERAVQUiYiIiAAqikREREQAFUUiIiIigIoiEREREUBFkYg4mclkYvny5c4Oo9SmTZtG69atnR2GiJSCiiIRMRs2bBgmk4lHHnmkwLJRo0ZhMpkYNmyYXbeZmppq8eTt0ujVqxeenp5s3brVLuMVxlohN27cuALPeBIR16KiSEQshIaGsmTJEi5evGhuu3TpEgkJCdStW9fu2wsJCcHX17fU46SkpLB582ZGjx7NokWLbF4/JyeH3NzcEm8/ICCAatWqlXh9EXE+FUUiYiEiIoLQ0FCWLl1qblu6dCl169alTZs2Fn2zsrJ44oknCA4Oxs/Pj1tvvdV8lCY3N5c6deowb948i3V27tyJh4cHR44cAQoedTl69Cj33XcflStXpmrVqsTExHD48OHrxr148WL+8pe/8Oijj/LRRx9ZFHXWxMfHU7lyZb744gtuueUWfH19SUlJYevWrURFRVG9enUqVapE165d2bFjh3m9+vXrA3D33XdjMpnM7689fTZs2DBiY2N55ZVXqFmzJtWqVWPUqFFkZ2eb+6SmphIdHU2FChVo0KABCQkJ1K9fn9dff/26+YqI/akoEpEChg8fzuLFi83vFy1axIMPPlig34QJE/j88895//332bFjB40aNaJXr1789ttveHh4EBcXR0JCgsU6H374IV26dKFevXoFxsvOzqZXr14EBgayYcMGNm3aREBAAL179+by5cuFxmsYBosXL+b+++8nLCyMRo0a8dlnn103z8zMTF566SUWLFjAnj17CA4O5vz58wwdOpSNGzfy3Xff0bhxY/r27cv58+cBzEXf4sWLSU1NLfJU3bfffsvBgwf59ttvef/994mPjyc+Pt68fMiQIZw4cYKkpCQ+//xz3n33XU6fPn3duEXEQZz8QFoRKUeGDh1qxMTEGKdPnzZ8fX2Nw4cPG4cPHzb8/PyM//3vf0ZMTIz5CdgZGRmGt7e38eGHH5rXv3z5slGrVi3j5ZdfNgzDMHbu3GmYTCbjyJEjhmEYRk5OjlG7dm1j3rx55nUAY9myZYZhGMYHH3xgNG3a1MjNzTUvz8rKMipUqGCsXr260Li//vpr46abbjKys7MNwzCMOXPmGF27di0y18WLFxuAkZycXGS/nJwcIzAw0PjPf/5jNeZ8U6dONVq1amV+P3ToUKNevXrGlStXzG0DBgwwBg4caBiGYezdu9cAjK1bt5qX79+/3wCMOXPmFBmTiDiGjhSJSAE33XQT0dHRxMfHs3jxYqKjo6levbpFn4MHD5KdnU2XLl3Mbd7e3nTo0IG9e/cC0Lp1a8LDw81Hi9atW8fp06cZMGCA1e3+8MMPHDhwgMDAQAICAggICKBq1apcunSJgwcPFhrvokWLGDhwIF5eXgDExcWxadOmItcB8PHxoWXLlhZtp06d4qGHHqJx48ZUqlSJoKAgMjIySElJKXIsa5o1a4anp6f5fc2aNc1Hgvbt24eXlxcRERHm5Y0aNaJKlSo2b0dE7MPL2QGISPk0fPhwRo8eDcBbb71V4nEGDx5MQkICEydOJCEhgd69exc6ITkjI4O2bdvy4YcfFlh20003WV3nt99+Y9myZWRnZ1vMX8rJyWHRokU8//zzhcZWoUIFTCaTRdvQoUM5e/Ysc+fOpV69evj6+hIZGVnk6bvCeHt7W7w3mUylmswtIo6lI0UiYlX+PJ78eT7XatiwIT4+PmzatMnclp2dzdatW7nlllvMbYMGDWL37t1s376dzz77jMGDBxe6zYiICPbv309wcDCNGjWyeFWqVMnqOh9++CF16tThhx9+IDk52fx69dVXiY+PJycnx6a8N23axBNPPEHfvn1p1qwZvr6+nDlzxqKPt7e3zeNeq2nTply5coWdO3ea2w4cOMC5c+dKNa6IlJyKIhGxytPTk7179/LTTz9ZnALKV7FiRR599FHGjx/PqlWr+Omnn3jooYfIzMxkxIgR5n7169enc+fOjBgxgpycHPr161foNgcPHkz16tWJiYlhw4YNHDp0iKSkJJ544gmOHTtmdZ2FCxdy77330rx5c4vXiBEjOHPmDKtWrbIp78aNG/PBBx+wd+9evv/+ewYPHkyFChUs+tSvX5+1a9dy8uTJEhcxYWFh3HnnnTz88MP897//ZefOnTz88MNWj16JSNlQUSQihQoKCiIoKKjQ5S+++CL33HMPDzzwABERERw4cIDVq1cXmBczePBgfvjhB+6+++4CBcbV/P39Wb9+PXXr1qV///6Eh4czYsQILl26ZDWO7du388MPP3DPPfcUWFapUiV69OjBwoULbcg4r8g6d+4cERERPPDAA+ZbDlzt1VdfJTExkdDQ0AK3KbDFP//5T2rUqMHtt9/O3XffzUMPPURgYCB+fn4lHlNESs5kGIbh7CBERASOHTtGaGgoa9asoUePHs4OR+SGo6JIRMRJvvnmGzIyMmjRogWpqalMmDCB48eP88svvxSYpC0ijqerz0REnCQ7O5vJkyfz66+/EhgYSOfOnfnwww9VEIk4iY4UiYiIiKCJ1iIiIiKAiiIRERERQEWRiIiICKCiSERERARQUSQiIiICqCgSERERAVQUiYiIiAAqikREREQAFUUiIiIiAPw/ACC7XwepTPIAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title(\"User Movie Preference\", size=15) \n",
    "plt.xlabel(\"Movie A rating\")\n",
    "plt.ylabel(\"Movie B rating\")\n",
    "plt.grid()\n",
    "\n",
    "# 绘制原始样本点，要求不同的影片喜好类别用不同的颜色标记\n",
    "# 提示: 用scatter散点图绘制，用它的参数c实现不同的类别用不同的颜色标记\n",
    "plt.scatter(X[y==0][:,0],X[y==0][:,1],c='purple',label='Action')\n",
    "plt.scatter(X[y==1][:,0],X[y==1][:,1],c='yellow',label='Comedy')\n",
    "# 绘制新数据点，用红色x标记，大小为8\n",
    "# 提示：用plt.plot()绘制，用它的参数marker实现不同的标记符号\n",
    "plt.plot(new_user[:,0],new_user[:,1],'rx',markersize=8)\n",
    "\n",
    "# 新数据最近邻索引为第一个最近邻的索引\n",
    "dist, idx = knn.kneighbors(new_user)\n",
    "nearest = X[idx[0][0]] # 获取最近邻点的坐标，这是一个列表，第一个元素是x坐标，第二个元素是y坐标\n",
    "\n",
    "# 用红线标记新数据点与最近邻点的连接线\n",
    "# 提示：用plt.plot()绘制，用 r-- 实现红色虚线\n",
    "plt.plot([new_user[0,0],nearest[0]],[new_user[0,1],nearest[1]],color='r',linestyle='--')\n",
    "\n",
    "# 为每个点添加坐标文本  \n",
    "for x, y in zip(X[:, 0], X[:, 1]):\n",
    "    plt.text(x, y+0.1, f'({x}, {y})') \n",
    "\n",
    "# 为新数据点添加坐标文本\n",
    "plt.text(new_user[0,0], new_user[0,1]+0.1, f'({new_user[0,0]}, {new_user[0,1]})')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.18"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
